﻿/**
 * @file BasicTypes.h
 * @brief SSD仿真系统基础类型定义。
 *
 * @section PrimitiveTemplate_Explain PrimitiveTemplate模板说明
 * PrimitiveTemplate 是一个用于类型安全封装的模板结构体。
 *
 * 用法：
 *   template<class T, class N>
 *   struct PrimitiveTemplate { ... };
 *
 * 主要作用：
 * - 类型安全：通过第二个模板参数 N（通常为不同的空 struct），即使底层类型相同，不同分量不会混用，编译器会强类型检查。
 * - 语义区分：每个地址分量（如通道、设备、块、页、扇区等）都用不同类型表达，代码更易读、更易维护。
 * - 运算符重载：支持自增、自加、赋值等操作，使用体验与原生类型类似。
 * - 底层封装：实际值存储在成员变量 _ 中，支持隐式转换为原生类型。
 *
 * 示例：
 *   using tChannel = PrimitiveTemplate<U8, struct Channel>;
 *   using tDeviceInChannel = PrimitiveTemplate<U8, struct DeviceInChannel>;
 *   // 虽然底层都是U8，但不能混用，编译器会强类型检查。
 */
#ifndef __BasicTypes_h__
#define __BasicTypes_h__

#include <cstdint>

using U8 = std::uint_fast8_t;
using U16 = std::uint_fast16_t;
using U32 = std::uint_fast32_t;

/**
 * @brief 类型安全封装模板，提升分量语义和防止误用。
 * @tparam T 底层数据类型
 * @tparam N 区分不同分量的标签类型
 */
template <class T, class N>
struct PrimitiveTemplate
{
    /**
     * @brief 隐式转换为底层类型。
     */
    operator T() const { return _; }

    /**
     * @brief 赋值操作。
     * @param v 新值
     */
    void operator=(T v)
    {
        _ = v;
    }

    /**
     * @brief 前置自增操作。
     * @return 增加后的自身
     */
    PrimitiveTemplate<T, N> operator++()
    {
        ++_;
        return *this;
    }

    /**
     * @brief 后置自增操作。
     * @return 增加前的自身副本
     */
    PrimitiveTemplate<T, N> operator++(int)
    {
        const PrimitiveTemplate<T, N> old(*this);
        ++_;
        return old;
    }

    /**
     * @brief 与底层类型自加。
     * @param v 增加值
     * @return 增加后的自身
     */
    PrimitiveTemplate<T, N> operator+=(T v)
    {
        _ += v;
        return *this;
    }

    /**
     * @brief 与同类型自加。
     * @param v 增加值
     * @return 增加后的自身
     */
    PrimitiveTemplate<T, N> operator+=(PrimitiveTemplate<T, N> v)
    {
        _ += v._;
        return *this;
    }

    T _; /**< 实际存储的底层值 */
};

using tSectorCount = PrimitiveTemplate<U32, struct SectorCount>;
using tSectorOffset = PrimitiveTemplate<U32, struct SectorOffset>;

#endif